﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Boom.Navigation;
using Boom.GameObjects;

namespace Boom.GameObjects
{
    public class Player:GameObject
    {
        private CheckKeyBoard _CKey;
    
        private bool _ColTopLeft, _ColBotLeft, _ColTopRight, _ColBotRight;
        private Rectangle _TopLeft, _TopRight, _BotLeft, _BotRight;
       
        //Thay đổi khoảng của khung frame khi tăng tốc độ hay giảm tốc độ

        //trạng thái 0 : đối tượng chết
        //trạng thái 1 : đối tượng va chạm với quái hoặc lửa
        //trạng thái 2 : đối tượng bình thường
        //trạng thái 3 : đối tượng tăng tốc
        
        #region //Biến kiểm tra di chuyển và khung di chuyển

        public bool ColTopLeft
        {
            get { return _ColTopLeft; }
            set { _ColTopLeft = value; }
        }
        public bool ColBotLeft
        {
            get { return _ColBotLeft; }
            set { _ColBotLeft = value; }
        }
        public bool ColTopRight
        {
            get { return _ColTopRight; }
            set { _ColTopRight = value; }
        }
        public bool ColBotRight
        {
            get { return _ColBotRight; }
            set { _ColBotRight = value; }
        }

        public Rectangle TopLeft
        {
            get { return _TopLeft; }
        }
        public Rectangle TopRight
        {
            get { return _TopRight; }
        }
        public Rectangle BotLeft
        {
            get { return _BotLeft; }
        }
        public Rectangle BotRight
        {
            get { return _BotRight; }
        }

        #endregion

        //Thuộc tính bất tử : khi nhân vật bị trừ mạng sẽ được bảo vệ 2s
       
        public Player(Game Mygame, Vector2 Position,int HP, ref Texture2D Texture, CheckKeyBoard CKey)
            : base(Mygame,Position,ref Texture, 40, 40)
        {
            _CKey = CKey;
            _Hp = HP;
            _ColTopLeft = _ColBotLeft = _ColTopRight = _ColBotRight = false;
            _HoriFrame = 4;
            _FrameDead = 8;
            _FrameChangeStt = 4;
            _Power = 2;
            _ActiveFrame = 15;
            _Move = true;
            _Status = 2; 
        }

        
        //Điều khiển player bao gồm các phím di chuyển và đặt boom
        private void PlayerAction(GameTime gameTime)
        {
            Speed = new Vector2(0, 0);
            VectorA = 0;
            if (Move)
            {
                if (_CKey.NewKey.IsKeyDown(Keys.Left) && (!ColTopLeft || !ColBotLeft))
                {
                    MoveLeft(gameTime);
                }

                if (_CKey.NewKey.IsKeyDown(Keys.Up) && (!ColTopLeft || !ColTopRight))
                {
                    MoveUp(gameTime);
                }

                if (_CKey.NewKey.IsKeyDown(Keys.Right) && (!ColTopRight || !ColBotRight))
                {
                    MoveRight(gameTime);
                }

                if (_CKey.NewKey.IsKeyDown(Keys.Down) && (!ColBotLeft || !ColBotRight))
                {
                    MoveDown(gameTime);
                }
            }

            if (_CKey.Left)
            {
                Move = true;
                _ColTopLeft = _ColBotLeft = _ColTopRight = _ColBotRight = false;
                ActiveFrame = 3 + FrameBlock;
            }

            if (_CKey.Up)
            {
                Move = true;
                _ColTopLeft = _ColBotLeft = _ColTopRight = _ColBotRight = false;
                ActiveFrame = 7 + FrameBlock;
            }

            if (_CKey.Right)
            {
                Move = true;
                _ColTopLeft = _ColBotLeft = _ColTopRight = _ColBotRight = false;
                ActiveFrame = 11 + FrameBlock;
            }

            if (_CKey.Down)
            {
                Move = true;
                _ColTopLeft = _ColBotLeft = _ColTopRight = _ColBotRight = false;
                ActiveFrame = 15 + FrameBlock;
            }
        }

        //Cập nhật khung hình bao quanh nhân vật
        private void Update_Bounds()
        {
            _Bounds = new Rectangle((int)Position.X + 10, (int)Position.Y + 10, 20, 20);
            _TopLeft = new Rectangle((int)Position.X + 3, (int)Position.Y + 8, 2, 2);
            _TopRight = new Rectangle((int)Position.X + 35, (int)Position.Y + 8, 2, 2);
            _BotRight = new Rectangle((int)Position.X + 35, (int)Position.Y + 41, 2, 2);
            _BotLeft = new Rectangle((int)Position.X + 3, (int)Position.Y + 41, 2, 2);
        }
        
        //Xử lý khi va chạm
        private void Resolve_Obs()
        {
            //Hướng va chạm khi di chuyển về bên trái
            if (VectorA == 1 && ColBotLeft && !ColTopLeft)
            {
                Speed = new Vector2(0, -Power);
                ColBotLeft = false;
            }

            if (VectorA == 1 && !ColBotLeft && ColTopLeft)
            {
                Speed = new Vector2(0, Power);
                ColTopLeft = false;
            }
               
            //Hướng va chạm khi di chuyển lên trên
            if (VectorA == 2 && ColTopLeft && !ColTopRight)
            {
                Speed = new Vector2(Power, 0);
                ColTopLeft = false;
            }

            if (VectorA == 2 && !ColTopLeft && ColTopRight)
            {
                Speed = new Vector2(-Power, 0);
                ColTopRight = false;
            }

            //Hướng va chạm khi di chuyển về bên phải
            if (VectorA == 3 && ColTopRight && !ColBotRight)
            {
                Speed = new Vector2(0, Power);
                ColTopRight = false;
            }

            if (VectorA == 3 && !ColTopRight && ColBotRight)
            {
                Speed = new Vector2(0, -Power);
                ColBotRight = false;
            }

            //Hướng va chạm khi di chuyển xuống dưới
            if (VectorA == 4 && ColBotLeft && !ColBotRight)
            {
                Speed = new Vector2(Power, 0);
                ColBotLeft = false;
            }

            if (VectorA == 4 && !ColBotLeft && ColBotRight)
            {
                Speed = new Vector2(-Power, 0);
                ColBotRight = false;
            }
        }

        protected override void UpdateStatus()
        {
            if (Status == 0) HP = 0;

            if (Status == 1)
            {
                Immortal = true;
            }

            if (Status == 2)
            {
                ChangeFrame = false;
                Power = 2;
            }
            if (Status == 3)
            {
                ChangeFrame = true;
                Power = 3;
            }
                
            base.UpdateStatus();
        }

        public override void Update(GameTime gameTime)
        {    
            Update_Bounds();
            PlayerAction(gameTime);
            Resolve_Obs();
            base.Update(gameTime);
        }
    }
}
